const recorderManager = wx.getRecorderManager();
const innerAudioContext = wx.createInnerAudioContext();

const baseUrl = 'http://localhost:5000';

// 引入封装的后端调用模块
// const http = require('../../utils/http.js');

Page({

  data: {
    fixedContent: '请按照如下文字，念出您的信息我的姓名是XXX,我的身份证号是XXXXXX。',
    editableContent: '',
    recording: false,
    recordFilePath: '',
    buttonText: '开始录音',
    recognitionResult: ''//存储识别结果
  },

    // 检查并获取录音权限
    checkRecordPermission() {
      return new Promise((resolve, reject) => {
        wx.getSetting({
          success(res) {
            if (res.authSetting['scope.record']) {
              resolve();
            } else {
              wx.authorize({
                scope: 'scope.record',
                success() {
                  resolve();
                },
                fail() {
                  reject('用户未授予录音权限');
                }
              });
            }
          },
          fail() {
            reject('获取录音权限设置失败');
          }
        });
      });
    },

  uploadAndRecognizeRecording() {
    const recordPath = this.data.recordFilePath;
    if (!recordPath) {
      wx.showToast({
        title: '请先录制录音',
        icon: 'none'
      });
      return;
    }
  
    // 读取录音文件内容为二进制
    // const fs = wx.getFileSystemManager();
    // const buffer = fs.readFileSync(recordPath);

    // 将二进制数据转换为base64编码
    // const base64Data = wx.arrayBufferToBase64(buffer);

    // // 构建上传数据
    // const formData = {
    //   // audio_data: base64Data   //base64Data无法识别
    //   audio_data: buffer   //直接将二进制数据放入
    // };

    // http.uploadFile(formData, recordPath)
    //   .then((res) => {
    //     // 假设后端返回的识别结果在res.text中
    //     this.setData({
    //       recognitionResult: res.text, // 将识别结果设置到recognitionResult中
    //       buttonText: '开始录音'
    //     });
    //   })
    //   .catch((err) => {
    //     wx.showToast({
    //       title: '识别失败，请稍后再试',
    //       icon: 'none',
          // duration: 2000
        // });
      // });
      // const formData = {};
      wx.uploadFile({
        filePath: recordPath,
        name: 'audio_data',
        url: baseUrl + '/recognize',
        formData: {},
        header: { 'content-type': 'multipart/form-data' },
        success: function (res) {
            try {
                const responseData = JSON.parse(res.data);
                if (responseData.code === 200 && responseData.text) {
                    this.setData({
                      // 先将editableContent设置为空字符串
                      editableContent: '',
                      // 再将识别结果赋值给editableContent
                      editableContent: responseData.text,
                      buttonText: '开始录音'
                    });
                    // 获取页面元素并更新其内容
                    wx.createSelectorQuery().select('#recognition-result').fields({
                      dataset: true,
                      size: true,
                      rect: true,
                      scrollOffset: true,
                      properties: ['scrollX', 'scrollY']
                    }).exec((nodes) => {
                      if (nodes[0]) {
                        nodes[0].textContent = responseData.text;
                      }
                    });
                } else {
                    wx.showToast({
                        title: responseData.message || '识别出现其他错误',
                        icon: 'none',
                        duration: 2000
                    });
                }
            } catch (e) {
                console.log('无法解析识别结果：', e);
                console.log('接收到的原始返回数据：', res.data);
            }
        }.bind(this),
        fail: function (err) {
          console.log('上传失败，详细错误信息：', err);
          if (err.errMsg.includes('network')) {
            wx.showToast({
              title: '网络连接出现问题，请检查网络设置后重试',
              icon: 'none',
              duration: 2000
          });
      } else if (err.errMsg.includes('file')) {
          wx.showToast({
              title: '文件相关错误，请检查音频文件是否正常',
              icon: 'none',
              duration: 2000
          });
      } else {
          wx.showToast({
              title: '上传出现其他未知错误，请稍后重试',
              icon: 'none',
              duration: 2000
          });
          }
        }
    });
},

  toggleRecording() {
    if (this.data.recording) {
      // 停止录音逻辑
      this.setData({ recording: false });
      recorderManager.stop();
      recorderManager.onStop((res) => {
        // 将录音文件临时路径存储到本地存储
        wx.setStorageSync('recordPath', res.tempFilePath);
        this.setData({ recordFilePath: res.tempFilePath });
        // 这里调用后端代码进行录音转文字
        // this.setData({ editableContent: '转换后的文本内容' });
        this.setData({ buttonText: '开始录音' });
      });
    } else {
      this.checkRecordPermission().then(() => {
      // 开始录音逻辑
      this.setData({ recording: true });
      recorderManager.start({
        format: 'wav', // 设置为wav格式
       duration: 60000, 
      sampleRate: 44100, 
      numberOfChannels: 1, 
       encodeBitRate: 96000
      });
      this.setData({ buttonText: '停止录音' });
    }).catch((error) => {
      wx.showToast({
        title: 'error',
        icon:'none'
      });
    });
  }
  },
  playRecording() {

    if (this.data.recording) {
      return;
    }

    const recordFilePath = this.data.recordFilePath;
    if (!recordFilePath) {
      wx.showToast({
        title: '请先录制录音',
        icon: 'none'
      });
      return;
    }
    console.log('即将播放的音频文件路径:', this.data.recordFilePath);

    // 重新初始化innerAudioContext
    // 重置innerAudioContext的相关状态
    innerAudioContext.stop(); // 先停止当前可能正在播放的音频
    innerAudioContext.src = ''; // 清空播放源
    innerAudioContext.offPlay(); // 移除之前绑定的onPlay事件回调
    innerAudioContext.offError(); // 移除之前绑定的onError事件回调
    // 重新设置播放源以及绑定新的事件回调
    innerAudioContext.src = recordFilePath;
    innerAudioContext.onPlay(() => {
        console.log('开始播放录音');
        this.setData({ playing: true, buttonText: '暂停播放' });
    });
    innerAudioContext.onError((error) => {
        console.log('播放录音出错：', error);
        console.log('错误详细信息：', JSON.stringify(error));
    });
    innerAudioContext.play();
  },

onTextInput(e) {
  this.setData({
    editableContent: e.detail.value
  });
},
uploadRecording() {
  const recordPath = this.data.recordFilePath;
  if (!recordPath) {
    wx.showToast({
      title: '请先录制录音',
      icon: 'none'
    });
    return;
  }

  const formData = {
    audioFile: wx.getFileSystemManager().readFileSync(recordPath)
  };

  wx.uploadFile({
    filePath: recordPath,
    name: 'audioFile', // 这里根据后端接收文件的字段名进行修改，假设后端用audioFile接收
    url: baseUrl + '/upload_audio', // 假设后端有个专门的/upload_audio接口用于接收音频文件，按实际调整
    formData: formData,
    header: { 'content-type': 'multipart/form-data' },
    success: function (res) {
        try {
            const responseData = JSON.parse(res.data);
            if (responseData.code === 200) {
                wx.showToast({
                    title: '录音上传成功',
                    icon: 'success'
                });
            } else {
                wx.showToast({
                    title: responseData.message || '录音上传失败，请稍后再试',
                    icon: 'none'
                });
            }
        } catch (e) {
            console.log('无法解析上传文件返回结果：', e);
            wx.showToast({
                title: '上传文件返回结果解析失败，请稍后再试',
                icon: 'none'
            });
        }
    },
    fail: function (err) {
        console.log('录音上传失败，详细错误信息：', err);
        if (err.errMsg.includes('network')) {
            wx.showToast({
                title: '网络连接出现问题，请检查网络设置后重试',
                icon: 'none',
                duration: 2000
            });
        } else if (err.errMsg.includes('file')) {
            wx.showToast({
                title: '文件相关错误，请检查音频文件是否正常',
                icon: 'none',
                duration: 2000
            });
        } else {
            wx.showToast({
                title: '录音上传出现其他未知错误，请稍后重试',
                icon: 'none',
                duration: 2000
            });
        }
    }
  });
  }
});